﻿
////小红有一个长度为n 的字符串s，仅包含小写字母，小红可以选出k 个字符
////，组成一个新的字符串t，对于t 的每一个字符𝑡𝑖​，如果𝑡𝑖​在t 中出现的次数为y，
////则小红会获得y 的分数，现在小红想知道，她最多能获得多少分。
////输入描述 :
////第一行两个整数n, k，表示字符串s 的长度和小红选出的字符个数。
////第二行一个字符串s，表示小红的字符串。
////1≤k≤n≤10^5
////输出描述:
////输出一个整数，表示小红最多能获得的分数。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
bool cmp(int a, int b) {
    return b < a;
}
int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n, k;
    std::cin >> n >> k;
    std::string s;
    std::cin >> s;
    std::vector<int> cnt(26);
    for (auto c : s) {
        cnt[c - 'a']++;//将字符串中的i个字符转换成0-25的索引
        //比如a对应的索引为0
    }

    sort(cnt.begin(), cnt.end(), cmp);//降序排列
    ll ans = 0;
    //计算出现的最大数时，当子串中的字符数量越多时，得分越高
    //所以再计算得分时会使用平方
    for (int i = 0; i < 26; i++) {//循环遍历
        if (k > cnt[i]) {//如果k大于字符i出现的次数
            ans += 1ll * cnt[i] * cnt[i];//cnt[i] 是字符 i 的出现次数。
            //这里判断当前可选择的字符数量 k 是否大于当前字符的出现次数 cnt[i]。
            //如果 k 大于 cnt[i]，说明可以选择这个字符的所有出现次数。则最大和就是
            //cnt[i]的平方
            k -= cnt[i];//将 k 减去当前字符的出现次数 cnt[i]，
            //表示已经选择了这部分字符
        }
        else {
            ans += 1ll * k * k;
            break;
            //如果 k 小于或等于 cnt[i]，说明不能选择当前字符的所有出现次数。
            //在这种情况下，计算得分为 k* k，即选择 k 次的得分。
            //然后使用 break 跳出循环，因为已经用尽了可选择的字符数量 k
        }
    }

    std::cout << ans << '\n';

    return 0;
}